package modelos;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import logica.DisciplinaInvalidaException;
import transferencia.DisciplinaTO;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Classe utilizada como base de testes enquanto não utilizamos o banco de dados do outro grupo.
 * Assim que tivermos acesso ao banco, esta classe deve ser alterada.
 * @author lljotall/tribek
 */
public class DisciplinaDAO {
    
    private static final List<DisciplinaTO> disciplinas = Arrays.asList(
               new DisciplinaTO("MC102", "Algoritmos e Programação de Computadores", null),
               new DisciplinaTO("MC202", "Estruturas de Dados", Arrays.asList("MC102")),
               new DisciplinaTO("MC302", "Programação Orientada a Objetos", Arrays.asList("MC202")),       
               new DisciplinaTO("EQ101", "Introdução a Processos e Indústrias Químicas", null),
               new DisciplinaTO("EQ481", "Introdução à Engenharia Química", Arrays.asList("EQ101")),
               new DisciplinaTO("QG101", "Química I", null),
               new DisciplinaTO("QG102", "Química Experimental I", null),
               new DisciplinaTO("QI242", "Química Inorgânica Teórica", Arrays.asList("QG101", "QG102")),
               new DisciplinaTO("QI244", "Química Inorgânica Experimental", Arrays.asList("QG101", "QG102")),
               new DisciplinaTO("QO323", "Química Orgânica I (Engenharia Química)", Arrays.asList("QG101")),
               new DisciplinaTO("EQ531", "Aplicações dos Materiais em Engenharia Química", Arrays.asList("QI242", "QI244", "QO323")),
               new DisciplinaTO("EQ622", "Eletroquímica e Corrosão", Arrays.asList("EQ531")),
               new DisciplinaTO("MA141", "Geometria Analítica e Vetores", null),
               new DisciplinaTO("MA111", "Cálculo I", null),  
               new DisciplinaTO("MS211", "Cálculo Numérico", Arrays.asList("MA141", "MA111", "MC102")),
               new DisciplinaTO("MA211", "Cálculo II", Arrays.asList("MA141", "MA111")),
               new DisciplinaTO("ME414", "Estatística para Experimentalistas", Arrays.asList("MA111")), 
               new DisciplinaTO("MA311", "Cálculo III", Arrays.asList("MA211")),
               new DisciplinaTO("F 128", "Fisica Geral I", null),
               new DisciplinaTO("F 313", "Mecânica Geral", Arrays.asList("F 128", "MA141", "MA211")),
               new DisciplinaTO("EQ541", "Fenômenos de Transporte I", Arrays.asList("F 313", "MA311")),
               new DisciplinaTO("EQ502", "Introdução à Análise de Processos", Arrays.asList("MS211", "MA311", "EQ481")),
               new DisciplinaTO("EQ771", "Instrumentação na Indústria Química", Arrays.asList("EQ502", "EQ541", "MS211")),
               new DisciplinaTO("EQ601", "Laboratório de Engenharia Química I", Arrays.asList("EQ541", "ME414", "MS211")),
               new DisciplinaTO("EQ817", "Controle de Processos", Arrays.asList("EQ502", "EQ771")),
               ////////////////////////////////////////////////////////////////////////////////////////////////////////
               new DisciplinaTO("EE400", "Métodos de Engenharia Elétrica", Arrays.asList("MA311")),
               new DisciplinaTO("ME323", "Introdução aos Modelos Probabilísticos", Arrays.asList("MA311")),
               new DisciplinaTO("EA614", "Análise de Sinais", Arrays.asList("EE400")),
               new DisciplinaTO("EE881", "Princípios de Comunicação I", Arrays.asList("EE400","ME323")),
               new DisciplinaTO("EE882", "Laboratório de Comunicação I", Arrays.asList("EE882")),
               new DisciplinaTO("MC404", "Organização Básica de Computadores e Linguagem de Montagem", Arrays.asList("MC202")),
               new DisciplinaTO("EA876", "Introdução a Software de Sistema", Arrays.asList("MC404")),
               new DisciplinaTO("EA075", "Introdução ao Projeto de Sistemas Embarcados", Arrays.asList("MC404")),
               new DisciplinaTO("MC358", "Fundamentos Matemáticos da Computação", null),
               new DisciplinaTO("MC458", "Projeto e Análise de Algoritmos I",Arrays.asList("MC358","MC202","ME323")),
               new DisciplinaTO("EA772", "Circuitos Lógicos", null),
               new DisciplinaTO("EA773", "Laboratório de Circuitos Lógicos", Arrays.asList("EA772")),
               new DisciplinaTO("F 228", "Fisica Geral II", Arrays.asList("F 128")), 		   
               new DisciplinaTO("F 328", "Fisica Geral III", Arrays.asList("F 128","MA141","MA111")),
               new DisciplinaTO("F 428", "Fisica Geral IV", Arrays.asList("F 328")),
               new DisciplinaTO("F 129", "Fisica Experimental I",null), 	
               new DisciplinaTO("F 229", "Fisica Experimental II",Arrays.asList("F 128","F 129")),
               new DisciplinaTO("F 329", "Fisica Experimental III",Arrays.asList("MA111","F 129")),
               new DisciplinaTO("F 429", "Fisica Experimental IV",Arrays.asList("F 329")),	   
               new DisciplinaTO("MA327", "Álgebra Linear", Arrays.asList("MA111")),
               new DisciplinaTO("EA513", "Circuitos Elétricos", Arrays.asList("MA111")),	
               new DisciplinaTO("F 315", "Mecânica Geral I", Arrays.asList("F 128","MA211")),
               new DisciplinaTO("EA616", "Análise Linear de Sistemas", Arrays.asList("MA327","EA614")),	  
               new DisciplinaTO("EA871", "Laboratório de Programação Básica de Sistemas Digitais", Arrays.asList("MC404")),	   
               new DisciplinaTO("EE532", "Eletrônica Aplicada", Arrays.asList("EA513"))	   
                                        
    );
    
    public static List<DisciplinaTO> getDisciplinas(){
        return disciplinas;
    }
    /**
     * Realiza uma busca por nome na base de teste
     * @param nome Nome da disciplina desejada
     * @return Objeto da classe discplina cujo nome é igual ao parâmetro. 
     * Ou null no caso de nenhuma disciplina ser encontrada
     */
    public static DisciplinaTO getDisciplinaNome(String nome){
        for (DisciplinaTO D: disciplinas){
            if (D.getNome().equalsIgnoreCase(nome)){
                return D;
            }
        }
        return null;
    }
 /**
     Realiza uma busca pela sigla na base de teste
     * @param sigla
     * @return DisciplinaTO
     * @throws DisciplinaInvalidaException lança a exceção de disciplina inexistente, caso não seja encontrada uma matéria com a sigla especificada.
     */
    public static DisciplinaTO getDisciplinaSigla(String sigla) throws DisciplinaInvalidaException{
        for (DisciplinaTO D: disciplinas){
            if(D.getSigla().equalsIgnoreCase(sigla)){
                 return D;
            }
        }
        //return null;
        throw new DisciplinaInvalidaException(DisciplinaInvalidaException.DISCIPLINA_INEXISTENTE);
    }  
    
/**
 * 
 * @param Sigla
 * @param Ano
 * @return 
 */
    public DisciplinaTO getDisciplinaSigla(String Sigla, int Ano){
                    try{
                        String host = "jdbc:mysql://143.106.150.216:3306/SatodaDB?zeroDateTimeBehavior=convertToNull";
                        String uName = "satoda";
                        String uPass = "adotas2014";
                        
                        Connection con = DriverManager.getConnection(host, uName, uPass);
                        
                        Statement stmt = con.createStatement( );
                        String SQL = "SELECT * FROM DISCIPLINA WHERE Codigo = '"+Sigla+"' AND GRUPOPREREQ = '1' AND ANO = '"+Ano+"';";
                        ResultSet rs = stmt.executeQuery(SQL);
                        DisciplinaTO nova = new DisciplinaTO("x", "y", null);
                        List<String> resultados = new ArrayList();  
                        while(rs.next()){
                            nova.setSigla(rs.getString("Codigo"));
                            nova.setNome(rs.getString("NOME"));
                            resultados.add(rs.getString("PREREUISITO_COD"));
                        }
                        nova.setPreRequisitos(resultados);
                        
                        return nova;
                                
                    }
                    catch( SQLException err ){
                        System.out.println(err.getMessage());
                        return null;
                    }
    }



}